﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using M2B.GestionEntretiens.DAL;
using M2B.GestionEntretiens.POCOS;

namespace M2B.GestionEntretiens.BLL
{
    /// <summary>
    /// Cette Classe décrit le service Entretiens
    /// </summary>
    /// <remarks>
    /// Informations de la classe : 
    /// <list type="bullet">
    /// <item name="authors">Auteur : M2B : Maher SAMMARI</item>
    /// <item name="creation date">Date de création : 01/04/2014</item>
    /// <item name="last modification">Date de dernière modification : 01/04/2014</item>
    /// </list>
    /// </remarks>
    public class EntretiensManager
    {
        #region Properties
        /// <summary>
        /// Interface unit of work
        /// </summary>
        private IUnitOfWork _unitOfWork;
        #endregion

        #region Constructeurs
        /// <summary>
        /// Constructeur ayant comme paramétre l'interface unit of work
        /// </summary>
        /// <param name="unitOfWork">Unit of Work</param>
        public EntretiensManager(IUnitOfWork unitOfWork)
        {
            _unitOfWork = unitOfWork;
        }
        #endregion

        #region Méthodes
        /// <summary>
        /// Récupération de tous les Entretiens
        /// </summary>
        /// <returns>Entretiens</returns>
        public IEnumerable<Entretien> GetEntretiens(string entityToEnclude)
        {
            return _unitOfWork.EntretiensRepository.GetAll(entityToEnclude);
        }
        /// <summary>
        /// Récupération d'un Entretien par Id
        /// </summary>
        /// <param name="id">Identificateur</param>
        /// <returns></returns>
        public Entretien GetEntretienById(long id)
        {
            return _unitOfWork.EntretiensRepository.GetById(id);
        }
        /// <summary>
        /// Création d'un Entretien
        /// </summary>
        /// <param name="entretien">Entretien</param>
        public void AddEntretien(Entretien entretien)
        {
            if (entretien != null)
            {
                var candidat = _unitOfWork.CandidatsRepository.GetById(entretien.Candidat.CandidatId);
                var test = _unitOfWork.TestsRepository.GetById(entretien.Test.TestId);
                entretien.DateCreation = DateTime.Now;
                entretien.DateModification = DateTime.Now;
                entretien.Candidat = candidat;
                entretien.Test = test;
                _unitOfWork.EntretiensRepository.Add(entretien);
                SaveEntretiens();
            }
        }
        /// <summary>
        /// Mise à jour d'un Entretien
        /// </summary>
        /// <param name="entretien">Entretien à mettre à jour</param>
        public void UpdateEntretien(Entretien entretien)
        {
            if (entretien != null)
            {
                var original = _unitOfWork.EntretiensRepository.GetById(entretien.EntretienId);
                var candidat = _unitOfWork.CandidatsRepository.GetById(entretien.Candidat.CandidatId);
                var test = _unitOfWork.TestsRepository.GetById(entretien.Test.TestId);
              
                entretien.Candidat = null;
                entretien.Test = null;
                entretien.DateCreation = original.DateCreation;
                entretien.DateModification = DateTime.Now;

                foreach (PropertyDescriptor item in TypeDescriptor.GetProperties(entretien))
                {
                    item.SetValue(original, item.GetValue(entretien));
                }
                original.Test = test;
                original.Candidat = candidat;
               
                SaveEntretiens();
            }
        }
        /// <summary>
        /// Suppression d'un Entretien
        /// </summary>
        /// <param name="id">Identificateur</param>
        public void DeleteEntretien(long id)
        {
            var entretienToDelete = GetEntretienById(id);
            if (entretienToDelete != null)
            {
                _unitOfWork.EntretiensRepository.Delete(entretienToDelete);
                SaveEntretiens();
            }

        }
        /// <summary>
        /// Sauvegarde et Commit
        /// </summary>
        public void SaveEntretiens()
        {
            _unitOfWork.Commit();
        }
        #endregion

    }
}
